]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
system: Switch between alternatives on long-press
authorFlorian Müllner <fmuellner@gnome.org>
Mon, 2 Mar 2015 11:14:54 +0000 (12:14 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Wed, 15 Feb 2017 22:20:14 +0000 (23:20 +0100)
On systems that support both shutdown and suspend, the latter operation
is currently only accessible via pressing the Alt key. As using the
keyboard may be inconvenient or simply not possible (e.g. on touch),
allow switching between alternatives via long-press as well.

https://bugzilla.gnome.org/show_bug.cgi?id=721173

js/ui/status/system.js

index 1d666cfb8dcde58d36d43ebdad3e1be70c604622..92ccf4c484b481d48b765f2488f164407c05cd66 100644 (file)
@@ -48,8 +48,14 @@ const AltSwitcher = new Lang.Class({
 
         this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
 
+        this._flipped = false;
+
+        this._clickAction = new Clutter.ClickAction();
+        this._clickAction.connect('long-press', Lang.bind(this, this._onLongPress));
+
         this.actor = new St.Bin();
         this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
+        this.actor.connect('notify::mapped', () => { this._flipped = false; });
     },
 
     _sync: function() {
@@ -58,14 +64,25 @@ const AltSwitcher = new Lang.Class({
         if (this._standard.visible && this._alternate.visible) {
             let [x, y, mods] = global.get_pointer();
             let altPressed = (mods & Clutter.ModifierType.MOD1_MASK) != 0;
-            childToShow = altPressed ? this._alternate : this._standard;
+            if (this._flipped)
+                childToShow = altPressed ? this._standard : this._alternate;
+            else
+                childToShow = altPressed ? this._alternate : this._standard;
         } else if (this._standard.visible) {
             childToShow = this._standard;
         } else if (this._alternate.visible) {
             childToShow = this._alternate;
         }
 
-        if (this.actor.get_child() != childToShow) {
+        let childShown = this.actor.get_child();
+        if (childShown != childToShow) {
+            if (childShown) {
+                if (childShown.fake_release)
+                    childShown.fake_release();
+                childShown.remove_action(this._clickAction);
+            }
+            childToShow.add_action(this._clickAction);
+
             let hasFocus = this.actor.contains(global.stage.get_key_focus());
             this.actor.set_child(childToShow);
             if (hasFocus)
@@ -96,6 +113,16 @@ const AltSwitcher = new Lang.Class({
 
         return Clutter.EVENT_PROPAGATE;
     },
+
+    _onLongPress: function(action, actor, state) {
+        if (state == Clutter.LongPressState.QUERY ||
+            state == Clutter.LongPressState.CANCEL)
+            return true;
+
+        this._flipped = !this._flipped;
+        this._sync();
+        return true;
+    }
 });
 
 const Indicator = new Lang.Class({